% Ejercicio "Sentencia try-catch-finally"
\subsection*{\fbox{\theejercicio} - Sentencia {\tt try-catch-finally}}

Para el tratamiento de excepciones en tiempo de ejecuci\'on, el lenguaje JAVA incluye un mecanismo de control basado en sentencias {\tt try-catch-finaly}. La sintaxis (simplificada) de este tipo de sentencias viene dada por la siguiente gram\'atica: 

\begin{center}
\begin{tabular}{|lcl|} \hline
                       &               &                                                 \\
{\em Sentencia}        & $\rightarrow$ & {\em Sent-excepci\'on}                          \\
                       & $|$           & {\em SENT}                                      \\
{\em Sent-excepci\'on} & $\rightarrow$ & {\em Parte-try Parte-catch Parte-finally}       \\
{\em Parte-try}        & $\rightarrow$ & {\tt try} {\bf \{} {\em Sentencia} {\bf \}}     \\
{\em Parte-catch}      & $\rightarrow$ & $\varepsilon$                                   \\
                       & $|$           & {\em Parte-catch} {\tt catch} {\bf (}{\em TIPO VAR}{\bf ) \{}  {\em Sentencia} {\bf \}} \\
{\em Parte-finally}    & $\rightarrow$ & $\varepsilon$                                   \\
                       & $|$           & {\tt finally} {\bf \{} {\em Sentencia} {\bf \}} \\
                       &               &                                                 \\ \hline
\end{tabular}
\end{center}

En donde {\em SENT} representa cualquier sentencia del lenguaje, {\em TIPO} es un identificador del tipo de excepci\'on que se produce y {\em VAR} es un identificador de variable. (A los efectos de este problema pueden considerarse como s\'{\i}mbolos terminales de la gram\'atica).

\smallskip

Para la gram\'atica que aparece en este enunciado y suponiendo que se realiza un an\'alisis ascendente, construir una gram\'atica con atributos ( o esquema de traducci\'on) que obtenga en un atributo asociado al axioma el conjunto de los tipos de excepciones que se capturan en las partes {\tt catch}, por ejemplo:

\begin{center}
\begin{tabular}{|l|} \hline
\verb@try {@                               \\
\verb@     try {@                          \\
\verb@          @{\em SENT}                \\
\verb@     }@                              \\
\verb@     catch (IOException e) {@        \\
\verb@          @{\em SENT}                \\
\verb@     }@                              \\
\verb@catch (ArrayOutOfBoudException e) {@ \\
\verb@     @{\em SENT}                     \\
\verb@}@                                   \\
\verb@catch (ArithmeticException e) {@     \\
\verb@     @{\em SENT}                     \\
\verb@}@                                   \\
\verb@finally {@                           \\
\verb@     @{\em SENT}                     \\
\verb@}@                                   \\ \hline
\end{tabular}
\end{center}

debe generar el conjunto con tres elementos:

{\tt \{ IOException, ArrayOutOfBoundException, ArithmeticException \}}

NOTA: Para la resoluci\'on de este apartado se considera que se ha implementado el tipo abstracto de datos conjunto, y las operaciones:

\begin{center}
\begin{tabular}{ll}
{\tt vacio(Conjunto)}             & inicializa el conjunto al vac\'{\i}o           \\
{\tt incluir(Conjunto, Elemento)} & incluye un elemento en el conjunto             \\
{\tt union(Conjunto1, Conjunto2)} & halla la uni\'on de ambos conjuntos            \\
                                  & y devuelve el resultado en el primer argumento \\
\end{tabular}
\end{center}

% Solución del ejercicio
\subsubsection*{SOLUCI\'ON}

Se define un atributo {\tt cjt} de tipo conjunto para todos los s\'{\i}mbolos no terminales de la gram\'atica, se supone que el terminal {\em TIPO} lleva asociado un atributo {\tt excep} de tipo elemento, correspondiente al tipo de la excepci\'on

\begin{center}
\begin{tabular}{|lcl|} \hline
                       &               &                                                                 \\
{\em Sentencia}        & $\rightarrow$ & {\em Sent-excepci\'on}                                          \\
                       &               & \ \ \ \{ $Sentencia.cjt = Sent$-$excepcion.cjt;$ \}             \\
                       & $|$           & {\em SENT}                                                      \\
                       &               & \ \ \ \{ $vacio(Sentencia.cjt);$ \}                             \\
{\em Sent-excepci\'on} & $\rightarrow$ & {\em Parte-try Parte-catch Parte-finally}                       \\
                       &               & \ \ \ \{                                                        \\
                       &               & \ \ \ \ \ \ $vacio(Sent$-$excepcion.cjt);$                      \\
                       &               & \ \ \ \ \ \ $union(Sent$-$excepcion.cjt, Parte$-$try.cjt);$     \\
                       &               & \ \ \ \ \ \ $union(Sent$-$excepcion.cjt, Parte$-$catch.cjt);$   \\
                       &               & \ \ \ \ \ \ $union(Sent$-$excepcion.cjt, Parte$-$finally.cjt);$ \\
                       &               & \ \ \ \}                                                        \\
{\em Parte-try}        & $\rightarrow$ & {\tt try} {\bf \{} {\em Sentencia} {\bf \}}                     \\
                       &               & \ \ \ \{ $Parte$-$try.cjt = Sentencia.cjt;$ \}                  \\
{\em Parte-catch}      & $\rightarrow$ & $\varepsilon$                                                   \\
                       &               & \ \ \ \{ $vacio(Parte$-$catch.cjt);$ \}                         \\
                       & $|$           & {\em Parte-catch$_1$} {\tt catch} {\bf (}{\em TIPO VAR}{\bf ) \{} {\em Sentencia} {\bf \}} {\em Parte-catch} \\
                       &               & \ \ \ \{                                                        \\
                       &               & \ \ \ \ \ \ $union(Parte$-$catch.cjt, Parte$-$catch_1.cjt);$    \\
                       &               & \ \ \ \ \ \ $incluir(Parte$-$catch.cjt, Tipo.excep);$           \\
                       &               & \ \ \ \}                                                        \\
{\em Parte-finally}    & $\rightarrow$ & $\varepsilon$                                                   \\
                       &               & \ \ \ \{ $vacio(Parte$-$finally.cjt);$ \}                       \\
                       & $|$           & {\tt finally} {\bf \{} {\em Sentencia} {\bf \}}                 \\
                       &               & \ \ \ \{ $Parte$-$finally.cjt = Sentencia.cjt;$ \}              \\
                       &               &                                                                 \\ \hline
\end{tabular}
\end{center}

